home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE MARKST(OPTION,IERR)
- *-----------------------------------------------------------------------
- *
- * in SSTA, suppresses multiple blanks outside strings, puts strings
- * in special characters,
- * '{' and '}'. strings may be either ...H, or be
- * included in single or double quotes.
- *
- *--- input
- * OPTION (character) 'FULL' or 'PART' to extract
- * all, or just start (up to first bracket)
- * NCHST number of ch. in SSTA
- *
- *--- output
- * IERR = 0 if everything OK, =1 if illegal characters found,
- * or unclosed string.
- * SSTA COMMON/ALCAZA/ FORTRAN fields 7-72 of SIMA
- * NCHST COMMON/STATE/ last non-blank in SSTA
- *
- *
- *-----------------------------------------------------------------------
- include 'PARAM.h'
- include 'ALCAZA.h'
- include 'CURSTA.h'
- CHARACTER STEMP*1,SKEEP*1,SDUM*100,OPTION*4
- LOGICAL POSS,SPOSS,PARTFL,LASTBL
- include 'CONVEX.h'
- PARTFL=OPTION.EQ.'PART'
- NCH=0
- NDUM=0
- ISKIP=0
- *--- ISKIP = 0 outside string
- * = -1 inside hollerith string (nH...)
- * = +1 inside character string (' or ")
- NHOLL=0
- IERR=0
- POSS=.FALSE.
- SPOSS=.FALSE.
- STEMP=' '
- J=0
- 10 CONTINUE
- J=J+1
- IF (J.GT.NCHST) GOTO 20
- LASTBL=STEMP.NE.' '
- STEMP=SSTA(J:J)
- IF (PARTFL) THEN
- IF (STEMP.EQ.'(')GOTO 30
- ENDIF
- IF (INDEX(SPILL,STEMP).NE.0) THEN
- *--- illegal character
- GOTO 40
- ENDIF
- IF (ISKIP.EQ.0) THEN
- *--- not in string
- IF (STEMP.EQ.' ') THEN
- IF (LASTBL) THEN
- NCH=NCH+1
- SSTR(NCH:NCH)=' '
- ENDIF
- ELSEIF (NUMCH(STEMP)) THEN
- IF (POSS) THEN
- *--- count for ..H may start or continue
- IF (NHOLL.LT.10000) NHOLL=10*NHOLL+ICVAL(STEMP)-ICVAL('0'
- + )
- NDUM=NDUM+1
- *--- buffer digits
- SDUM(NDUM:NDUM)=STEMP
- ELSE
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- ENDIF
- ELSEIF (ALPHCH(STEMP)) THEN
- IF (NDUM.EQ.0) THEN
- *--- no digits (= holl. count ) buffered
- POSS=.FALSE.
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- ELSE
- IF (STEMP.EQ.'H') THEN
- NCH=NCH+1
- SSTR(NCH:NCH)='{'
- ISKIP=-1
- SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)
- NCH=NCH+NDUM+1
- SSTR(NCH:NCH)=STEMP
- ELSE
- *--- other alphabetic ch. than H
- POSS=.FALSE.
- NHOLL=0
- SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)
- NCH=NCH+NDUM+1
- SSTR(NCH:NCH)=STEMP
- ENDIF
- NDUM=0
- ENDIF
- ELSE
- *--- special character
- SPOSS=SPOSS.OR.STEMP.NE.'*'
- *--- holl. count cannot start after '*'
- POSS=SPOSS
- IF (NDUM.NE.0) THEN
- SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)
- NCH=NCH+NDUM
- NDUM=0
- ENDIF
- NHOLL=0
- IF (STEMP.EQ.''''.OR.STEMP.EQ.'"') THEN
- ISKIP=1
- SKEEP=STEMP
- NCH=NCH+1
- SSTR(NCH:NCH)='{'
- ENDIF
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- *--- following ENDIF for IF(STEMP.EQ.' ') THEN etc.
- ENDIF
- ELSEIF (ISKIP.LT.0) THEN
- *--- inside a holl. string
- NHOLL=NHOLL-1
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- IF (NHOLL.EQ.0) THEN
- *--- end of holl. string reached
- ISKIP=0
- NCH=NCH+1
- SSTR(NCH:NCH)='}'
- ENDIF
- ELSE
- *--- ISKIP GT 0
- IF (STEMP.EQ.''''.AND.SSTA(J+1:J+1).EQ.''''.AND.J.LT.NCHST)
- + THEN
- SSTR(NCH+1:NCH+2)=SSTA(J:J+1)
- J=J+1
- NCH=NCH+2
- ELSEIF (SKEEP.EQ.STEMP) THEN
- *--- end of string
- ISKIP=0
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- NCH=NCH+1
- SSTR(NCH:NCH)='}'
- ELSE
- NCH=NCH+1
- SSTR(NCH:NCH)=STEMP
- ENDIF
- ENDIF
- GOTO 10
- 20 CONTINUE
- IF(NDUM.GT.0) THEN
- *--- still some lonely digits hanging around
- SSTR(NCH+1:NCH+NDUM)=SDUM(:NDUM)
- NCH=NCH+NDUM
- ENDIF
- IF (ISKIP.NE.0) GOTO 40
- 30 NCHST=NCH
- SSTA(:NCH)=SSTR(:NCH)
- GOTO 999
- 40 CONTINUE
- *--- illegal - either unclosed string, or illegal character
- IERR=1
- 999 END
-